#ifndef __MYI2C_H
#define __MYI2C_H
#include "stm32f10x.h" // Device header
#include "Delay.h"

#define SCL_PIN GPIO_Pin_10
#define SDA_PIN GPIO_Pin_11

#define PASS 1
#define FAIL 0

#define I2C_SCL_OUT MyI2C_SCL_OUT()
#define I2C_SCL_IN MyI2C_SCL_In()
#define I2C_SDA_OUT MyI2C_SDA_OUT()
#define I2C_SDA_IN MyI2C_SDA_In()

#define I2C_SCL_RESET MyI2C_W_SCL(0)
#define I2C_SCL_SET MyI2C_W_SCL(1)
#define I2C_SDA_RESET MyI2C_W_SDA(0)
#define I2C_SDA_SET MyI2C_W_SDA(1)

#define I2C_SCL MyI2C_R_SCL()
#define I2C_SDA MyI2C_R_SDA()

#define IIC_NOP()
/**
* I2C基本通信协议：
*	起始条件：SCL高电平期间， SDA从高电平切换为低电平

*	终止条件：SCL高电平期间， SDA从低电平切换为高电平

*	主机向从机发送数据：
*			1、发送一个字节：SCL低电平期间，主机将数据位依次放到SDA线上（高位先行），
*				然后释放SCL，从机将在SCL高电平期间读取数据位，所以SCL高电平期间SDA不允许有数据变化，依次循环上述过程8次，即可发送一个字节

* 主机接收从机发送数据:
*			1、接收一个字节：SCL低电平期间，从机将数据位依次放到SDA线上（高位先行），然后释放SCL，主机将在SCL高电平期间读取数据位，
*				所以SCL高电平期间SDA不允许有数据变化，依次循环上述过程8次，即可接收一个字节（主机在接收之前，需要释放SDA）

*	主机向从机应答：
            发送应答：主机在接收完一个字节之后，在下一个时钟发送一位数据，数据0表示应答，数据1表示非应答

* 主机接收从机应答：
            接收应答：主机在发送完一个字节之后，在下一个时钟接收一位数据，判断从机是否应答，数据0表示应答，数据1表示非应答（主机在接收之前，需要释放SDA）

*
*
*
*/
void MyI2C_Init(void);
/**
 * 	起始条件：SCL高电平期间， SDA从高电平切换为低电平
 */
void MyI2C_Start(void);

/**
 * 	终止条件：SCL高电平期间， SDA从低电平切换为高电平
 */
void MyI2C_Stop(void);
void MyI2C_W_SCL(char Byte);
void MyI2C_W_SDA(char Byte);

// 主机向从机发送一个字节数据
// 1、发送一个字节：SCL低电平期间，主机将数据位依次放到SDA线上（高位先行），然后释放SCL，从机将在SCL高电平期间读取数据位，所以SCL高电平期间SDA不允许有数据变化，依次循环上述过程8次，即可发送一个字节
/**
    1010 1010
&	1000 0000
------------
    1000 0000

    1010 1010
&	0100 0000
------------
    0000 0000
*/
void MyI2C_SendByte(uint8_t Byte);

// 主机接收从机发送数据:
// 1、接收一个字节：SCL低电平期间，从机将数据位依次放到SDA线上（高位先行），然后释放SCL，主机将在SCL高电平期间读取数据位，所以SCL高电平期间SDA不允许有数据变化，依次循环上述过程8次，即可接收一个字节（主机在接收之前，需要释放SDA）
/**
    1010 1010
|	1000 0000
------------
    1010 1010

    1010 1010
|	0100 0000
------------
    1110 1010
*/
uint8_t MyI2C_ReceiveByte(void);

/**

*	主机向从机应答：
            发送应答：主机在接收完一个字节之后，在下一个时钟发送一位数据，数据0表示应答，数据1表示非应答
**/
void MyI2C_SendAsk(uint8_t AckBit);

/**

* 主机接收从机应答：
            接收应答：主机在发送完一个字节之后，在下一个时钟接收一位数据，判断从机是否应答，数据0表示应答，数据1表示非应答（主机在接收之前，需要释放SDA）
**/
uint8_t MyI2C_ReceiveAsk(void);

#endif
